#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//定义数组初始长度
#define InitSize 10

/*
*   动态分配数组
*/
typedef struct LNode{
    int *Data;//数组首地址
    int Length;//元素个数
    int MaxSize;//最大长度
} L, *List;


List init();
int find(int x, List Ptrl);
bool insert(List Ptrl, int i, int e);
int delete(List Ptrl, int i, int e);
void show(List Ptrl);

int main()
{
    List Ptrl = init();
    bool b = insert(Ptrl, 1, 1);
    bool c = insert(Ptrl, 1, 1);
    bool d = insert(Ptrl, 2, 2);
    int k = 0;
    int e = delete(Ptrl, 1, k);
    show(Ptrl);
    return 0;
}

List init() {
    List Ptrl =(List)malloc(sizeof(struct LNode));;
    Ptrl->Data = (int *)malloc(sizeof(int) * InitSize);
    Ptrl->Length = 0;
    Ptrl->MaxSize = InitSize;
    return Ptrl;
}

bool insert(List Ptrl, int i, int e) {
    //判断插入位置是否合法
    if(i<1 || i>Ptrl->Length+1){
        printf("插入位置不合法");
        return false;
    }
    //判断数组是否已满
    if(Ptrl->Length >= Ptrl->MaxSize) {
        printf("数组已满");
        return false;
    }
    //开始执行插入操作
    for (int j = Ptrl->Length; j>=i; j--) {
       Ptrl->Data[Ptrl->Length] = Ptrl->Data[Ptrl->Length-1];    
    }
    Ptrl->Data[i-1] = e;
    Ptrl->Length++;
    return true;

}

int delete(List Ptrl, int i, int e) {
    //判断删除位置是否合理
    if (i < 1 || i > Ptrl->Length) {
        printf("删除位置不合法");
        return -1;
    }
    //判断数组是否为空
    if (Ptrl->Length == 0) {
        printf("数组为空");
        return -1;
    }
    //将要删除的元素赋值给e用于返回
    e = Ptrl->Data[i-1];
    //将e后面的元素依次向前移动一位
    for(int j = i; j < Ptrl->Length; j++){
        Ptrl->Data[j-1] = Ptrl->Data[j];
    }
    Ptrl->Length--;
    return e;
}

int find(int x, List Ptrl) {
    for (int i = 0; i < Ptrl->Length; i++) {
        if (x == Ptrl->Data[i]) {
            return i+1;
        }
    }
   return 0;
}

void show(List Ptrl) {
    if (Ptrl->Length <= 0) {
        printf("数组为空");
    }
    printf("start print: ");
    for(int i = 0; i<=Ptrl->Length-1; i++) {
        printf(" %d ", Ptrl->Data[i]);
    }
    printf("over\n");
}